#ifndef MPPROCESSUTILS_H
#define MPPROCESSUTILS_H

#include "mpConfig.h"
#include <list>
#include <string>

#if defined(PLATFORM_UNIX)
 #include <unistd.h>
 #define PROCESS_PID pid_t
#else
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #define PROCESS_PID DWORD
#endif

namespace MP{
namespace ProcessUtils{

enum Errors
{
    /**
     * 以管理员身份运行失败返回的状态码
     */
    RunElevatedFailed = 255,
    /**
     * 程序运行失败返回的状态码
     */
    RunFailed = -8,
    /**
     * 如果等待应用程序退出并读取其状态代码失败，那么返回该状态码
     */
    WaitFailed = -1
};

/**
 * @brief 启动一个指定的应用程序，并等待应用程序执行完成，返回退出代码
 * @param executable 待运行的应用程序绝对路径
 * @param args 程序运行参数
 * @return 程序运行后的退出代码。如果程序无法运行则返回-1
 */
int runSync(const std::string& executable,const std::list<std::string>& args);

/**
 * @brief 启动一个指定的应用程序后立即返回，不用等待程序执行完成
 * @param executable 待运行的应用程序绝对路径
 * @param args 程序运行参数
 */
void runAsync(const std::string& executable,const std::list<std::string>& args);
/**
 * @brief 已管理员身份运行一个指定的应用程序
 * @param executable
 * @param args
 * @param task
 * @return 如果程序不能以管理员身份运行则返回255
 */
int runElevated(const std::string& executable,
                       const std::list<std::string>& args,
                       const std::string& task);

/**
 * @brief 等待指定进程退出
 * @param pid 进程Id
 * @return 如果进程存在且已退出则返回true,否则返回false
 */
bool waitForProcess(PROCESS_PID pid);

#ifdef PLATFORM_WINDOWS
/**
 * @brief 转换windows命令行参数
 * @param commandLine
 * @param argc
 * @param argv
 */
void convertWindowsCommandLine(LPCWSTR commandLine, int& argc, char**& argv);
#endif

}   //END ProcessUtils
}   //END MP



#endif // MPPROCESSUTILS_H
